package com.qidianit.mes.masterdata.controller;

import com.qidianit.mes.common.pojo.MesResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 戴着假发的程序员
 * @company 起点编程
 * @date 2025/7/23 13:59
 * @description
 */
@RestController
@RequestMapping("/generationNumber")
public class NumberGenerationController {

    @Value("${materialStartNumber:1}")
    private String materialStartNumber; // 其实序列编号，默认为1
    @Value("${materialStarNumberKey:NUMBER_GEN_MATERIAL}")
    private String materialNumberKey;
    // 注入redis的操作模版对象
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @GetMapping("/material")
    public MesResult<String> getMaterialNumber()
    {
        // 生成编号
        StringBuilder sbId = new StringBuilder();
        sbId.append("01");// 当前厂商的编号直接定死
        // 当前的日期
        Date date = new Date();
        sbId.append(new SimpleDateFormat("yyyyMMdd").format(date));
        // 序列号，从redis中获取
        // 从redis获取现有的序列号，如果没有就设置一个新的，使用其实序列编号
        String number = materialStartNumber;
        // 这里要确保高并发下依然只能有一次设置初始值的操作，所以要确保同步
        synchronized (this) {
            if(stringRedisTemplate.hasKey(materialNumberKey)){
                // redis中已经存在
                number = stringRedisTemplate.opsForValue().increment(materialNumberKey) + "";
            }else{
                // redis中不存在，我们就设置一个
                stringRedisTemplate.opsForValue().set(materialNumberKey, materialStartNumber);
            }
            if(number.length() < 5){
                for (int i = 0; i < 5 - number.length(); i++){
                    sbId.append("0");
                }
            }
        }
        sbId.append(number);
        return MesResult.success(sbId.toString());
    }
}
